package cn.itcast.web.controller.system;

import cn.itcast.common.utils.Encrypt;
import cn.itcast.common.utils.MailUtil;
import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.mq.MessageProducer;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/user/")
public class UserController extends BaseController {

	@Autowired
	private UserService userService;

	@Autowired
	private DeptService deptService;

	@Autowired
	private RoleService roleService;

	@Autowired
	private MessageProducer messageProducer;




	/**
	 * 分页
	 */
	@RequestMapping(value = "/list",name = "查询用户列表")
	public String list(@RequestParam(defaultValue = "1") int page,
	                   @RequestParam(defaultValue = "5") int size) {
		//1.调用service查询，参数: 当前登录用户的企业id，page，size
		PageInfo info = userService.findAll(getLoginCompanyId(),page,size);
		//2.存入到request域中
		request.setAttribute("page",info);

		//记录日志
		//3.跳转页面
		return "system/user/user-list";
	}

	/**
	 * 进入保存页面
	 */
	@RequestMapping(value="/toAdd",name = "进入保存页面")
	public String toAdd() {
		//1.查询当前登录用户所在企业的所有部门
		List list = deptService.findAll(getLoginCompanyId());
		//2.存入request中
		request.setAttribute("deptList",list);
		//记录日志
		//3.跳转页面
		return "system/user/user-add";
	}

	/**
	 * 进入修改页面
	 */
	@RequestMapping(value = "/toUpdate",name = "进入修改页面")
	public String toUpdate(String id) {
		//1.查询所有的部门（构造下拉框）
		List list = deptService.findAll(getLoginCompanyId());
		request.setAttribute("deptList",list);
		//2.根据id查询用户
		User user = userService.findById(id);
		request.setAttribute("user",user);
		//3.跳转页面
		return "system/user/user-update";
	}


	/**
	 * 新增或者保存用户
	 */
	@RequestMapping(value = "/edit",name ="新增或者保存用户" )
	public String edit(User user) throws Exception {
		//1.设置租户数据（基本信息）
		user.setCompanyId(getLoginCompanyId());
		user.setCompanyName(getLoginCompanyName());

		//2.判断参数中是否具有id
		if(StringUtils.isEmpty(user.getId())) {
			//2.1 如果没有id，保存
			//对用户输入的保存密码进行加密
			String password = user.getPassword();
			user.setPassword(Encrypt.md5(password,user.getEmail()));
			userService.save(user);

			//发送邮件
			String to = user.getEmail();
			String subject = "欢迎使用saas货代云平台";
			String content = "尊敬的用户"+user.getUserName()+"您好： 欢迎使用saas货代云平台！你访问的地址：http://localhost:8088/，你的登录邮箱"+user.getEmail()
					+"，登录密码："+password;
//			MailUtil.sendMsg(to,subject,content);

			Map map = new HashMap<>();
			map.put("to",to);
			map.put("subject",subject);
			map.put("content",content);
			messageProducer.sendMsg(map);
		}else{
			//2.2 有id，更新
			userService.update(user);
		}
		//记录日志
		//3.重定向到列表
		return "redirect:/system/user/list.do";
	}


	/**
	 * 删除用户
	 */
	@RequestMapping(value = "/delete",name = "删除用户")
	public String delete(String id) {
		//1.调用service删除
		userService.delete(id);
		//2.重定向到列表
		return "redirect:/system/user/list.do";
	}

	/**
	 * 进入分配角色的页面
	 *  参数：用户id
	 *  业务：
	 *      1.根据用户id查询用户
	 *      2.查询所有的角色
	 *      3.查询当前用户所具有的角色
	 *      4.将用户具有的所有角色id，封装为一个字符串（可以已“，”隔开）
	 *          老王 ： 1,2,3
	 *  页面处理：
	 *      <c:foreach items="${roleList}" var="role">
	 *          <input type="checkbox" /> ${role.name}
	 *      </c:foreach>
	 */
	@RequestMapping("/roleList")
	public String roleList(String id) {
		//1.根据用户id查询用户
		User user = userService.findById(id);
		request.setAttribute("user",user);
		//2.查询所有的角色
		List roleList = roleService.findAll(getLoginCompanyId());
		request.setAttribute("roleList",roleList);
		//3.查询当前用户所具有的角色 -- 复杂。  根据用户id，查询此用户可以具有的角色
		List<Role> userRoles = roleService.findByUserId(id);
		//4.为了回显
		String userRoleStr="";
		for (Role userRole : userRoles) {
			userRoleStr += userRole.getId() +",";
		}
		request.setAttribute("userRoleStr",userRoleStr);
		return "system/user/user-role";
	}

	/**
	 * 对用户分配角色
	 *      参数：
	 *          用户id: userid
	 *          同名参数：roleIds
	 *          在mvc中，处理同名参数，可以直接接受一个同名参数的数组
	 *      业务：
	 *          调用service完成角色分配
	 */
	@RequestMapping("/changeRole")
	public String changeRole(String userid,String[] roleIds) {
		userService.changeRole(userid,roleIds);
		return "redirect:/system/user/list.do";
	}
}
